Factories

The WOLF framework uses a factory-based system to dynamically create and configure components. This design allows users to define their system’s configuration in YAML files, enabling flexibility and modularity.

The creation of some of the WOLF nodes (landmark, map, processor, sensor, solver` and tree_manager) and WOLF ROS publishers and subscribers, can be performed using factories.

This allows modularity, i.e. the creation of nodes without need of adding to the code the corresponding include file. For example, to create a SensorLaser2d using the FactorySensorFile, you can use the following code without need of including sensor_laser_2d.h:

auto sensor_laser = FactorySensorFile::create("SensorLaser2d",
                                                "/path/to/sensor/config_file.yaml",
                                                {"path/containing/schemas",
                                                "path/containing/more/schemas"});

Two items are required to allow a factory-based creation of an object:

  1. Object Creators: The factory requires a static method with a common API that creates a derived class object returning a pointer of the base type. We call this methods “creators”.

  2. Creators registration: The creators should be registered in a factory with a unique type string (e.g., "SensorLaser2d"). This registration ensures that the factory knows how to instantiate the SensorLaser2d::create(...) when requested. This happens at loading time.

In WOLF there are two types of factories, requiring the corresponding creators.

  • FactoryXXXXFile: Take a YAML file as input and a vector of folders where to locate the schema files for validation.

  • FactoryXXXXNode: Take a YAML::Node (yaml-cpp) as input and a vector of folders where to locate the schema files for validation.

Where XXX can be substituted by the different nodes in wolf using factories: - Sensors - Processors - Solver - TreeManager - Landmarks (only has the factory taking YAML::Node) - Publishers (only has the factory taking YAML::Node) - Subscribers (only has the factory taking YAML::Node)

WOLF macros

For developer convenience, we provide two macros:

  • WOLF_REGISTER_SENSOR(SensorType): Registers the sensor creators in the corresponding factories.

  • WOLF_SENSOR_CREATE(SensorClass): Automatically implements the create methods for the sensor. Validates YAML parameters using the yaml_schema_cpp library and ensures the sensor is properly initialized. Finally, it links the node with the rest of the WOLF tree.

The analogous macros are provided for all the WOLF nodes using factories.

Note

When a plugin is loaded, you should see a message in the console that confirms that a creator has been registered to a factory. The following is an example of all creators registered when loading plugin core:

FactoryLandmark                 <-- registered  Landmark2d
FactoryLandmark                 <-- registered  Landmark3d
FactoryMapNode                  <-- registered  MapBase
FactoryMapFile                  <-- registered  MapBase
FactoryProcessor                <-- registered  ProcessorDiffDrive
FactoryProcessorYaml            <-- registered  ProcessorDiffDrive
FactoryProcessor                <-- registered  ProcessorFixedWingModel
FactoryProcessorYaml            <-- registered  ProcessorFixedWingModel
FactoryProcessor                <-- registered  ProcessorLandmarkExternal
FactoryProcessorYaml            <-- registered  ProcessorLandmarkExternal
FactoryProcessor                <-- registered  ProcessorOdom2d
FactoryProcessorYaml            <-- registered  ProcessorOdom2d
FactoryProcessor                <-- registered  ProcessorOdom3d
FactoryProcessorYaml            <-- registered  ProcessorOdom3d
FactoryProcessor                <-- registered  ProcessorPose2d
FactoryProcessorYaml            <-- registered  ProcessorPose2d
FactoryProcessor                <-- registered  ProcessorPose3d
FactoryProcessorYaml            <-- registered  ProcessorPose3d
FactorySensorNode               <-- registered  SensorDiffDrive
FactorySensorFile               <-- registered  SensorDiffDrive
FactorySensorNode               <-- registered  SensorMotionModel
FactorySensorFile               <-- registered  SensorMotionModel
FactorySensorNode               <-- registered  SensorOdom2d
FactorySensorFile               <-- registered  SensorOdom2d
FactorySensorNode               <-- registered  SensorOdom3d
FactorySensorFile               <-- registered  SensorOdom3d
FactorySensorNode               <-- registered  SensorPose2d
FactorySensorFile               <-- registered  SensorPose2d
FactorySensorNode               <-- registered  SensorPose3d
FactorySensorFile               <-- registered  SensorPose3d
FactoryStateBlock               <-- registered  StateQuaternion
FactoryStateBlockIdentity       <-- registered  StateQuaternion
FactoryStateBlockIdentityVector <-- registered  StateQuaternion
FactoryStateBlock               <-- registered  StateAngle
FactoryStateBlockIdentity       <-- registered  StateAngle
FactoryStateBlockIdentityVector <-- registered  StateAngle
FactoryStateBlock               <-- registered  StateHomogeneous3d
FactoryStateBlockIdentity       <-- registered  StateHomogeneous3d
FactoryStateBlockIdentityVector <-- registered  StateHomogeneous3d
FactoryStateBlock               <-- registered  StatePoint2d
FactoryStateBlockIdentity       <-- registered  StatePoint2d
FactoryStateBlockIdentityVector <-- registered  StatePoint2d
FactoryStateBlock               <-- registered  StateVector2d
FactoryStateBlockIdentity       <-- registered  StateVector2d
FactoryStateBlockIdentityVector <-- registered  StateVector2d
FactoryStateBlock               <-- registered  StatePoint3d
FactoryStateBlockIdentity       <-- registered  StatePoint3d
FactoryStateBlockIdentityVector <-- registered  StatePoint3d
FactoryStateBlock               <-- registered  StateVector3d
FactoryStateBlockIdentity       <-- registered  StateVector3d
FactoryStateBlockIdentityVector <-- registered  StateVector3d
FactoryStateBlock               <-- registered  StateParams1
FactoryStateBlockIdentity       <-- registered  StateParams1
FactoryStateBlockIdentityVector <-- registered  StateParams1
FactoryStateBlock               <-- registered  StateParams2
FactoryStateBlockIdentity       <-- registered  StateParams2
FactoryStateBlockIdentityVector <-- registered  StateParams2
FactoryStateBlock               <-- registered  StateParams3
FactoryStateBlockIdentity       <-- registered  StateParams3
FactoryStateBlockIdentityVector <-- registered  StateParams3
FactoryStateBlock               <-- registered  StateParams4
FactoryStateBlockIdentity       <-- registered  StateParams4
FactoryStateBlockIdentityVector <-- registered  StateParams4
FactoryStateBlock               <-- registered  StateParams5
FactoryStateBlockIdentity       <-- registered  StateParams5
FactoryStateBlockIdentityVector <-- registered  StateParams5
FactoryStateBlock               <-- registered  StateParams6
FactoryStateBlockIdentity       <-- registered  StateParams6
FactoryStateBlockIdentityVector <-- registered  StateParams6
FactoryStateBlock               <-- registered  StateParams7
FactoryStateBlockIdentity       <-- registered  StateParams7
FactoryStateBlockIdentityVector <-- registered  StateParams7
FactoryStateBlock               <-- registered  StateParams8
FactoryStateBlockIdentity       <-- registered  StateParams8
FactoryStateBlockIdentityVector <-- registered  StateParams8
FactoryStateBlock               <-- registered  StateParams9
FactoryStateBlockIdentity       <-- registered  StateParams9
FactoryStateBlockIdentityVector <-- registered  StateParams9
FactoryStateBlock               <-- registered  StateParams10
FactoryStateBlockIdentity       <-- registered  StateParams10
FactoryStateBlockIdentityVector <-- registered  StateParams10
FactoryStateBlock               <-- registered  StateParams11
FactoryStateBlockIdentity       <-- registered  StateParams11
FactoryStateBlockIdentityVector <-- registered  StateParams11
FactoryStateBlock               <-- registered  StateParams12
FactoryStateBlockIdentity       <-- registered  StateParams12
FactoryStateBlockIdentityVector <-- registered  StateParams12
FactoryStateBlock               <-- registered  StateParams13
FactoryStateBlockIdentity       <-- registered  StateParams13
FactoryStateBlockIdentityVector <-- registered  StateParams13
FactoryStateBlock               <-- registered  StateParams14
FactoryStateBlockIdentity       <-- registered  StateParams14
FactoryStateBlockIdentityVector <-- registered  StateParams14
FactoryStateBlock               <-- registered  StateParams15
FactoryStateBlockIdentity       <-- registered  StateParams15
FactoryStateBlockIdentityVector <-- registered  StateParams15
FactoryStateBlock               <-- registered  StateParams16
FactoryStateBlockIdentity       <-- registered  StateParams16
FactoryStateBlockIdentityVector <-- registered  StateParams16
FactoryStateBlock               <-- registered  StateParams17
FactoryStateBlockIdentity       <-- registered  StateParams17
FactoryStateBlockIdentityVector <-- registered  StateParams17
FactoryStateBlock               <-- registered  StateParams18
FactoryStateBlockIdentity       <-- registered  StateParams18
FactoryStateBlockIdentityVector <-- registered  StateParams18
FactoryStateBlock               <-- registered  StateParams19
FactoryStateBlockIdentity       <-- registered  StateParams19
FactoryStateBlockIdentityVector <-- registered  StateParams19
FactoryStateBlock               <-- registered  StateParams20
FactoryStateBlockIdentity       <-- registered  StateParams20
FactoryStateBlockIdentityVector <-- registered  StateParams20
FactoryTreeManagerNode          <-- registered  TreeManagerSlidingWindow
FactoryTreeManagerFile          <-- registered  TreeManagerSlidingWindow
FactoryTreeManagerNode          <-- registered  TreeManagerSlidingWindowDualRate
FactoryTreeManagerFile          <-- registered  TreeManagerSlidingWindowDualRate
FactorySolverNode               <-- registered  SolverCeres
FactorySolverFile               <-- registered  SolverCeres